package com.tjvib.util.retrofit;

import okhttp3.MultipartBody;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.DELETE;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.HTTP;
import retrofit2.http.Headers;
import retrofit2.http.Multipart;
import retrofit2.http.PATCH;
import retrofit2.http.POST;
import retrofit2.http.PUT;
import retrofit2.http.Part;
import retrofit2.http.Path;
import retrofit2.http.Query;
import retrofit2.http.Url;

import io.reactivex.Observable;

/**
 * 配置接口，请求地址和返回类型
 */
public interface ApiInterface {

    @HTTP(method = "DELETE", path = "/")
    //注销账号
    Observable<BaseResponse> delete_user(@Query("userId") String userId);

    /**
     * 文件上传
     */
    @Multipart
    @POST("user/upload")
    Observable<BaseResponse> upload(@Query("userId") String userId,
                                    @Part MultipartBody.Part file);

    /**
     * user-controller
     */

    @POST("user/login_with_username")
    //用户名登录
    Observable<BaseResponse> login_with_username(@Query("username") String username,
                                                 @Query("password") String password);

    @POST("user/login_with_token")
    //token登录
    Observable<BaseResponse> login_with_token();

    @POST("user/verify_sms_code")
    //验证码登录
    Observable<BaseResponse> verift_sms_code(@Query("phone_number") String phone_number,
                                             @Query("sms_code") String sms_code);

    @POST("user/login_with_phone_number")
    //密码登录
    Observable<BaseResponse> login_with_phone_number(@Query("phone_number") String phone_number,
                                                     @Query("password") String password);

    @POST("user/get_sms_code")
    //获取验证码
    Observable<BaseResponse> get_sms_code(@Query("phone_number") String phone_number);

    @POST("user/get_info")
    //获取用户信息
    Observable<BaseResponse> get_info(@Query("userId") String userId);

    @POST("user/change_passwd")
    //修改密码
    Observable<BaseResponse> change_passwd(@Query("userId") String userId,
                                           @Query("smsCode") String smsCode,
                                           @Query("newPasswd") String newPasswd);

    @Headers({"Content-Type: application/json"})
    @PUT("user/change_info")
    //修改用户信息
    Observable<BaseResponse> change_info(@Body RequestBody user,
                                         @Query("userId") String userId);

    @Headers({"Content-Type: application/json"})
    @POST("user/feedback")
    //意见反馈
    Observable<BaseResponse> feedback(@Body RequestBody user,
                                      @Query("userId") String userId);


    /**
     * app-info-controller
     */
    @GET("appinfo/version")
    //获取版本信息
    Observable<BaseResponse> getVersion();


    /**
     * data-controller
     */
    @POST("data/delete")
    Observable<BaseResponse> delete(@Query("userId") String userId,
                                    @Query("dataSetId") String dataSetId);

    @POST("data/getDataSetContent")
    Observable<BaseResponse> getDataSetContent(@Query("userId") String userId,
                                               @Query("dataSetId") String dataSetId);

    @POST("data/getDataSetsInfoList")
    Observable<BaseResponse> getDataSetsInfoList(@Query("userId") String userId);


    /**
     * order-controller
     */
    @POST("order/gen")
    Observable<BaseResponse> gen(@Query("userId") String userId,
                                 @Query("product") int product,
                                 @Query("amount") double amount,
                                 @Query("type") int type);

    @POST("order/get_list")
    Observable<BaseResponse> get_list(@Query("userId") String userId);

    @POST("order/createWechatOrder")
    Observable<BaseResponse> createWechatOrder(@Query("userId") String userId,
                                               @Query("orderId") String orderId);

    @POST("order/createAlipayOrder")
    Observable<BaseResponse> createAlipayOrder(@Query("userId") String userId,
                                               @Query("orderId") String orderId);


    /**
     * task-controller
     */
    @POST("task/analyse")
    Observable<BaseResponse> analyse(@Query("userId") String userId,
                                     @Query("dataSetId") String dataSetId);

    @Headers({"Content-Type: application/json"})
    @POST("task/collectLocal")
    Observable<BaseResponse> collectLocal(@Query("userId") String userId,
                                          @Body RequestBody dataSet);

    @Headers({"Content-Type: application/json"})
    @POST("task/collectLpmsB2")
    Observable<BaseResponse> collectLpmsB2(@Query("userId") String userId,
                                           @Body RequestBody dataSet);

    @Headers({"Content-Type: application/json"})
    @POST("task/hs_compute")
    Observable<BaseResponse> hs_compute(@Body RequestBody acc,
                                        @Query("userId") String userId);
}
